home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / mui_add-ons / mcc_tron / source / tron.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-11  |  8.0 KB  |  399 lines

  1. /*
  2.  
  3.         Tron.mcc (c) Copyright 1995-96 by kmel, Klaus Melchior
  4.  
  5.         Registered MUI class, Serial Number: 0002
  6.  
  7.         tron.c
  8.  
  9. */
  10.  
  11.  
  12.  
  13.  
  14. /* SMAKE */
  15.  
  16. /*** includes ***/
  17.  
  18. #ifdef __KMEL
  19.     #include <kmel/kmel.h>
  20.     #include <kmel/kmel_debug.h>
  21.  
  22.     #include <mui/tron_mcc.h>
  23. #else
  24.     #include <clib/alib_protos.h>
  25.     #include <clib/graphics_protos.h>
  26.     #include <clib/utility_protos.h>
  27.     #include <clib/muimaster_protos.h>
  28.     #include <pragmas/muimaster_pragmas.h>
  29.     #include <libraries/mui.h>
  30.  
  31.     #if MUIMASTER_VLATEST <= 14
  32.         #include "mui/mui33_mcc.h"
  33.     #endif
  34.  
  35.     #include "mui/tron_mcc_private.h"
  36.  
  37.     #define DB / ## /
  38. #endif
  39.  
  40.  
  41. #define D / ## /
  42.  
  43.  
  44. #define CLASS       MUIC_Tron
  45. #define SUPERCLASS  MUIC_Area
  46.  
  47. struct Data
  48. {
  49.     LONG  Pen1;
  50.     LONG  Pen2;
  51.     LONG  PenB;
  52.     LONG  Speed;
  53.  
  54.     struct MUI_RenderInfo *mri;
  55.     BOOL refresh;
  56.     BOOL showhide;
  57. };
  58.  
  59. #include "rev/Tron.mcc.rev"
  60.  
  61. #define UserLibID "$VER: " __VERS " (" __DATE ") " __VERSCR
  62. #define VERSION __VERSION
  63. #define REVISION __REVISION
  64. #define MASTERVERSION 14
  65.  
  66. #include "mui/mccheader.c"
  67.  
  68.  
  69. /*** subs ***/
  70.  
  71. void release_pen(struct MUI_RenderInfo *mri, LONG *pen)
  72. {
  73.     if(*pen != -1)
  74.     {
  75.         /*** only valid between Setup/Cleanup ! ***/
  76.         if(mri)
  77.             MUI_ReleasePen(mri, *pen);
  78.  
  79.         *pen = -1;
  80.     }
  81. }
  82.  
  83. void obtain_pen(struct MUI_RenderInfo *mri, LONG *pen, struct MUI_PenSpec *ps)
  84. {
  85.     /*** only valid between Setup/Cleanup ! ***/
  86.     if(mri)
  87.     {
  88.         release_pen(mri, pen);
  89.         *pen = MUI_ObtainPen(mri, ps, 0);
  90.     }
  91. }
  92.  
  93.  
  94. void RedrawAll(Object *obj, struct Data *data)
  95. {
  96.     /*** only valid between Show/Hide ! ***/
  97.     if(data->showhide)
  98.     {
  99.         SetAPen(_rp(obj), MUIPEN(data->PenB));
  100.         RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj));
  101.  
  102.         SetAPen(_rp(obj), MUIPEN(data->Pen1));
  103.         RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mleft(obj) + data->Speed, _mbottom(obj));
  104.  
  105.         SetAPen(_rp(obj), MUIPEN(data->Pen2));
  106.         RectFill(_rp(obj), _mright(obj) - data->Speed, _mtop(obj), _mright(obj), _mbottom(obj));
  107.     }
  108.  
  109. }
  110.  
  111.  
  112.  
  113. ULONG ASM _New(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  114. {
  115.     struct Data *data;
  116.  
  117.     if (!(obj = (Object *)DoSuperMethodA(cl, obj, msg)))
  118.         return(0);
  119.  
  120.     /*** init data ***/
  121.     data = INST_DATA(cl, obj);
  122.  
  123.     data->Pen1    = -1;
  124.     data->Pen2    = -1;
  125.     data->PenB    = -1;
  126.     data->Speed   = DEFAULT_SPEED;
  127.  
  128.     data->mri     = NULL;
  129.     data->refresh = FALSE;
  130.  
  131.     /*** trick to set arguments ***/
  132.     msg->MethodID = OM_SET;
  133.     DoMethodA(obj, (Msg)msg);
  134.     msg->MethodID = OM_NEW;
  135.  
  136.     return((ULONG)obj);
  137. }
  138.  
  139.  
  140.  
  141. ULONG ASM _Dispose(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  142. {
  143.     return(DoSuperMethodA(cl,obj,msg));
  144. }
  145.  
  146.  
  147.  
  148. ULONG ASM _Set(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  149. {
  150.     struct Data *data = INST_DATA(cl, obj);
  151.     struct TagItem *tags,*tag;
  152.  
  153.     for(tags=((struct opSet *)msg)->ops_AttrList; tag=NextTagItem(&tags); )
  154.     {
  155.         switch(tag->ti_Tag)
  156.         {
  157.             case MUIA_Tron_Speed:
  158.                 DB("SET MUIA_Tron_Speed; %ld\n", tag->ti_Data);
  159.                 if(data->Speed != tag->ti_Data)
  160.                 {
  161.                     data->Speed = tag->ti_Data;
  162.                     data->refresh = TRUE;
  163.                 }
  164.             break;
  165.  
  166.             case MUIA_Tron_PenSpec1:
  167.                 if(data->mri)
  168.                 {
  169.                     obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)tag->ti_Data);
  170.                     data->refresh = TRUE;
  171.                 }
  172.             break;
  173.  
  174.             case MUIA_Tron_PenSpec2:
  175.                 if(data->mri)
  176.                 {
  177.                     obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)tag->ti_Data);
  178.                     data->refresh = TRUE;
  179.                 }
  180.             break;
  181.  
  182.             case MUIA_Tron_PenSpecB:
  183.                 if(data->mri)
  184.                 {
  185.                     obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)tag->ti_Data);
  186.                     data->refresh = TRUE;
  187.                 }
  188.             break;
  189.  
  190.         }
  191.     }
  192.  
  193.     if(data->refresh)
  194.     {
  195.         RedrawAll(obj, data);
  196.  
  197.         data->refresh = FALSE;
  198.     }
  199.  
  200.     return(DoSuperMethodA(cl, obj, msg));
  201. }
  202.  
  203.  
  204. static ULONG ASM _Get(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  205. {
  206. //    struct Data *data = INST_DATA(cl, obj);
  207.     ULONG *store = ((struct opGet *)msg)->opg_Storage;
  208.  
  209.     switch( ((struct opGet *)msg)->opg_AttrID )
  210.     {
  211.         case MUIA_Version:  *store = VERSION;  return(TRUE); break;
  212.         case MUIA_Revision: *store = REVISION; return(TRUE); break;
  213.     }
  214.  
  215.     return(DoSuperMethodA(cl, obj, msg));
  216. }
  217.  
  218.  
  219. static ULONG ASM _Setup(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_Setup *msg)
  220. {
  221.     struct Data *data = INST_DATA(cl, obj);
  222.     Object *pd_obj;
  223.     ULONG l;
  224.  
  225.     if(!(DoSuperMethodA(cl,obj,(Msg)msg)))
  226.         return(FALSE);
  227.  
  228.     data->mri = msg->RenderInfo;
  229.  
  230.     /*** create objects ***/
  231.     pd_obj = MUI_NewObject(MUIC_Pendisplay, TAG_DONE);
  232.  
  233.     DB("pd_obj:%08lx\n", pd_obj);
  234.  
  235.     /*** get pen 1 ***/
  236.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Pen1, &l))
  237.     {
  238.         obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)l);
  239.     }
  240.     else
  241.     {
  242.         if(pd_obj)
  243.         {
  244.             struct MUI_PenSpec *pen;
  245.  
  246.             DoMethod(pd_obj, MUIM_Pendisplay_SetMUIPen, DEFAULT_PEN1);
  247.             get(pd_obj, MUIA_Pendisplay_Spec, &pen);
  248.             obtain_pen(data->mri, &data->Pen1, pen);
  249.         }
  250.     }
  251.     
  252.     DB("Obtain Pen1: %ld\n", MUIPEN(data->Pen1));
  253.  
  254.     /*** get pen 2 ***/
  255.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Pen2, &l))
  256.     {
  257.         obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)l);
  258.     }
  259.     else
  260.     {
  261.         if(pd_obj)
  262.         {
  263.             struct MUI_PenSpec *pen;
  264.  
  265.             DoMethod(pd_obj, MUIM_Pendisplay_SetMUIPen, DEFAULT_PEN2);
  266.             get(pd_obj, MUIA_Pendisplay_Spec, &pen);
  267.             obtain_pen(data->mri, &data->Pen2, pen);
  268.         }
  269.     }
  270.     DB("Obtain Pen2: %ld\n", MUIPEN(data->Pen2));
  271.  
  272.     /*** get pen B ***/
  273.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_PenB, &l))
  274.     {
  275.         obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)l);
  276.     }
  277.     else
  278.     {
  279.         if(pd_obj)
  280.         {
  281.             struct MUI_PenSpec *pen;
  282.  
  283.             DoMethod(pd_obj, MUIM_Pendisplay_SetMUIPen, DEFAULT_PENB);
  284.             get(pd_obj, MUIA_Pendisplay_Spec, &pen);
  285.             obtain_pen(data->mri, &data->PenB, pen);
  286.         }
  287.     }
  288.     DB("Obtain PenB: %ld\n", MUIPEN(data->PenB));
  289.  
  290.  
  291.     /*** get speed ***/
  292.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Speed, &l))
  293.     {
  294.         data->Speed = *(ULONG *)l;
  295.     }
  296.     else
  297.         data->Speed = DEFAULT_SPEED;
  298.     DB("Speed: %ld\n", data->Speed);
  299.  
  300.     /*** dispose created objects ***/
  301.     if(pd_obj)
  302.         MUI_DisposeObject(pd_obj);
  303.  
  304.     return(TRUE);
  305. }
  306.  
  307.  
  308. static ULONG ASM _Cleanup(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  309. {
  310.     struct Data *data = INST_DATA(cl, obj);
  311.  
  312.     release_pen(data->mri, &data->Pen1);
  313.     release_pen(data->mri, &data->Pen2);
  314.     release_pen(data->mri, &data->PenB);
  315.  
  316.     data->mri = NULL;
  317.  
  318.     return(DoSuperMethodA(cl,obj,msg));
  319. }
  320.  
  321.  
  322. STATIC ULONG ASM _Show(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  323. {
  324.     struct Data *data = INST_DATA(cl, obj);
  325.  
  326.     data->showhide = TRUE;
  327.  
  328.     return(DoSuperMethodA(cl,obj,msg));
  329. }
  330.  
  331.  
  332. STATIC ULONG ASM _Hide(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  333. {
  334.     struct Data *data = INST_DATA(cl, obj);
  335.  
  336.     data->showhide = FALSE;
  337.  
  338.     return(DoSuperMethodA(cl,obj,msg));
  339. }
  340.  
  341.  
  342. ULONG ASM _AskMinMax(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_AskMinMax *msg)
  343. {
  344.     DoSuperMethodA(cl, obj, (Msg)msg);
  345.  
  346.     msg->MinMaxInfo->MinWidth  += 20;
  347.     msg->MinMaxInfo->DefWidth  += 50;
  348.     msg->MinMaxInfo->MaxWidth  += MUI_MAXMAX;
  349.  
  350.     msg->MinMaxInfo->MinHeight += 20;
  351.     msg->MinMaxInfo->DefHeight += 50;
  352.     msg->MinMaxInfo->MaxHeight += MUI_MAXMAX;
  353.  
  354.     return(0);
  355. }
  356.  
  357. ULONG ASM _Draw(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_Draw *msg)
  358. {
  359.     struct Data *data = INST_DATA(cl, obj);
  360.  
  361.     /*** first draw the superclass ***/
  362.     DoSuperMethodA(cl, obj, (Msg)msg);
  363.  
  364.     DB("_Draw\n");
  365.  
  366.     /*** move the Tron line ***/
  367.     if(msg->flags & MADF_DRAWUPDATE)
  368.     {
  369.     }
  370.     else if(msg->flags & MADF_DRAWOBJECT)
  371.     {
  372.         RedrawAll(obj, data);
  373.     }
  374.  
  375.     return(0);
  376. }
  377.  
  378.  
  379. ULONG ASM SAVEDS _Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  380. {
  381.     switch(msg->MethodID)
  382.     {
  383.         case OM_NEW        : return(_New      (cl,obj,(APTR)msg));
  384.         case OM_DISPOSE    : return(_Dispose  (cl,obj,(APTR)msg));
  385.         case OM_SET        : return(_Set      (cl,obj,(APTR)msg));
  386.         case OM_GET        : return(_Get      (cl,obj,(APTR)msg));
  387.  
  388.         case MUIM_Setup    : return(_Setup    (cl,obj,(APTR)msg));
  389.         case MUIM_Cleanup  : return(_Cleanup  (cl,obj,(APTR)msg));
  390.         case MUIM_Show     : return(_Show     (cl,obj,(APTR)msg));
  391.         case MUIM_Hide     : return(_Hide     (cl,obj,(APTR)msg));
  392.         case MUIM_AskMinMax: return(_AskMinMax(cl,obj,(APTR)msg));
  393.         case MUIM_Draw     : return(_Draw     (cl,obj,(APTR)msg));
  394.     }
  395.  
  396.     return(DoSuperMethodA(cl,obj,msg));
  397. }
  398.  
  399.